// pick omit
type pick<T, P extends keyof T> = {
  [K in P]: T[K]
}
type omit<T, P extends keyof T> = {
  [K in keyof T as K extends P ? never : K]: T[K]
}
type omit2<T, P extends keyof T> = {
  [K in exclude<keyof T, P>]: T[K]
}

type exclude<T, U> = T extends U ? never : T
type extract<T, U> = T extends U ? T : never


type partial<T> = {
  [P in keyof T]?: T[P]
}
type require<T> = {
  [P in keyof T]-?: T[P]
}

type concat<T, U> = T extends unknown[] ? U extends unknown[] ? [...T, ...U] : never : never

type push<T, U> = T extends [...infer P] ? [...P, U] : never;

type pop<T> = T extends [infer _, ...infer P] ? P : never

